#include "Parser.h"
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>

void print_test(char* name, bool result)
{
    printf("%s: %s\n", name, result? "OK" : "ERROR");
}

/* Prueba que las primitivas del vector funcionen correctamente. */
void prueba_CaracteresAlFinal()
{
    char* linea="HoLa coMo esTa?";  
	char* aux;
	int numero=1;
	int offset=0;
	int palabra = 0;
	
	Parser_t* parser1=Parser_crear(linea, numero, offset, palabra);
   
   
	print_test("Pruebo que el numero del archivo es el 1 ",Parser_numeroDelArchivo(parser1)==1);
	print_test("Pruebo que el offset es 0 ",Parser_offset(parser1) == 0);
	print_test("Pruebo que el Parseador no termino de parsear ",!Parser_TerminoDeParsear(parser1));
	
	aux=Parser_parsear(parser1);
	print_test("Pruebo que al Parser una ves toma hola ",strcmp( aux,"hola")==0);
	print_test("Pruebo que hola es la primer palabra ", Parser_numeroDePalabra(parser1) == 1);   
	print_test("Pruebo que el largo de Hola es 4 ",Parser_LargoUltimaPalabra(parser1)== 4);
	free(aux);
	print_test("Pruebo que el Parseador no termino de parsear ",!Parser_TerminoDeParsear(parser1));
	
	
	aux=Parser_parsear(parser1);
	print_test("Pruebo que el largo de como es 4 ",Parser_LargoUltimaPalabra(parser1)== 4);
	print_test("Pruebo que al Parser una ves toma como ",strcmp( aux,"como") == 0 );  
	print_test("Pruebo que el offset es 5 ",Parser_offset(parser1) == 5);
	free(aux);
	
	aux=Parser_parsear(parser1);  
	print_test("Pruebo que el largo de esta es 4 ",Parser_LargoUltimaPalabra(parser1)== 4);
	print_test("Pruebo que al Parser una ves NO toma 'esta?'",strcmp( aux,"esta?") != 0 );
	print_test("Pruebo que esta es la tercer palabra ", Parser_numeroDePalabra(parser1) == 3);
	print_test("Pruebo que al Parser una ves toma 'esta'",strcmp( aux,"esta") == 0 );
	print_test("Pruebo que el offset es 10 ",Parser_offset(parser1) == 10);
	free(aux);
	
	print_test("Pruebo que el Parseador termino de parsear ",Parser_TerminoDeParsear(parser1));
	
    Parser_destruir(parser1);

}

void prueba_CaracteresAlPrincipio() {
	
	char* linea=" % @HoLa coMo";  
	char* aux;
	int numero=2;
	int offset=0;
	int palabra = 0;
	
	Parser_t* parser1=Parser_crear(linea, numero, offset, palabra);
   
	printf("\n");
	print_test("Pruebo que el numero del archivo es el 2 ",Parser_numeroDelArchivo(parser1)==2);
	print_test("Pruebo que el offset es 0 ",Parser_offset(parser1) == 0);
	print_test("Pruebo que el Parseador no termino de parsear ",!Parser_TerminoDeParsear(parser1));
	
	aux=Parser_parsear(parser1);
	print_test("Pruebo que al Parser una ves toma hola ",strcmp( aux,"hola")==0);   
	print_test("Pruebo que el largo de Hola es 4 ",Parser_LargoUltimaPalabra(parser1)== 4);
	print_test("Pruebo que el offset es 4 ",Parser_offset(parser1) == 4);
	free(aux);
	
	aux=Parser_parsear(parser1);
	print_test("Pruebo que al Parser una ves toma como ",strcmp( aux,"como") == 0 );
	print_test("Pruebo que el largo de como es 4 ",Parser_LargoUltimaPalabra(parser1)== 4);  
	print_test("Pruebo que el offset es 9 ",Parser_offset(parser1) == 9);
	free(aux);
	
	print_test("Pruebo que el Parseador termino de parsear ",Parser_TerminoDeParsear(parser1));
	print_test("Pruebo que el final del archivo es 13 ",Parser_posicionEnArchivo(parser1) == 13);
	
	aux=Parser_parsear(parser1);
	print_test("Pruebo que no se parsea nada",strcmp( aux,"")==0);   
	free(aux);
	
	Parser_destruir(parser1);
}

void prueba_CaracteresEnElMedio() {
	
	char* linea = "sevenap@gmail.com";
	char* aux;
	int numero = 3;
	int offset = 0;
	int palabra = 0;
	
	Parser_t* parser1=Parser_crear(linea, numero, offset, palabra);
	
	printf("\n");
	aux=Parser_parsear(parser1);
	print_test("Pruebo que al Parser una ves toma sevenap ",strcmp( aux,"sevenap")==0);
	print_test("Pruebo que el offset es 0 ",Parser_offset(parser1) == 0);
	free(aux);
	
	aux=Parser_parsear(parser1);
	print_test("Pruebo que al Parser una ves toma gmail ",strcmp( aux,"gmail") == 0 );
	print_test("Pruebo que el largo de como es 5 ",Parser_LargoUltimaPalabra(parser1)== 5);  
	print_test("Pruebo que el offset es 8 ",Parser_offset(parser1) == 8);
	free(aux);
	
	aux=Parser_parsear(parser1);
	print_test("Pruebo que al Parser una ves toma com ",strcmp( aux,"com") == 0 );
	print_test("Pruebo que el largo de como es 3 ",Parser_LargoUltimaPalabra(parser1)== 3);  
	print_test("Pruebo que el offset es 14 ",Parser_offset(parser1) == 14);
	print_test("Pruebo que el final del archivo es 17 ",Parser_posicionEnArchivo(parser1) == 17);
	free(aux);
	
	Parser_destruir(parser1);
}

void prueba_DosStrings() {
	
	char* linea1 = "Hola Como";
	char* linea2 = "estas vos?";
	char* aux;
	int numero = 4;
	int offset = strlen(linea1);
	int palabra = 0;
	
	Parser_t* parser1=Parser_crear(linea2, numero, offset, palabra);
	printf("\n");
	print_test("Pruebo que el offset es 9 ",Parser_offset(parser1) == 9);
	aux=Parser_parsear(parser1);
	print_test("Pruebo que al Parser una ves toma estas ",strcmp( aux,"estas") == 0 );
	free(aux);
	
	aux=Parser_parsear(parser1);
	print_test("Pruebo que el offset es 15 ",Parser_offset(parser1) == 15);
	print_test("Pruebo que al Parser una ves toma vos ",strcmp( aux,"vos") == 0 );
	free(aux);
	
	print_test("Pruebo que el Parseador termino de parsear ",Parser_TerminoDeParsear(parser1));
	
	Parser_destruir(parser1);
}

void prueba_SegundoStringArrancaBasura() {
	
	char* linea1 = "Hola Como";
	char* linea2 = " @estas vos?";
	char* aux;
	int numero = 4;
	int offset = strlen(linea1);
	int palabra = 0;
	
	Parser_t* parser1=Parser_crear(linea2, numero, offset, palabra);
	printf("\n");
	
	aux=Parser_parsear(parser1);
	print_test("Pruebo que el offset es 11 ",Parser_offset(parser1) == 11);
	print_test("Pruebo que al Parser una ves toma estas ",strcmp( aux,"estas") == 0 );
	free(aux);
	
	aux=Parser_parsear(parser1);
	print_test("Pruebo que el offset es 17 ",Parser_offset(parser1) == 17);
	print_test("Pruebo que al Parser una ves toma vos ",strcmp( aux,"vos") == 0 );
	free(aux);
	
	print_test("Pruebo que el Parseador termino de parsear ",Parser_TerminoDeParsear(parser1));
	
	Parser_destruir(parser1);
	
}

void prueba_StringUnitario() {
	char* linea1 = "Buenas";
	char* aux;
	int numero = 4;
	int offset = 0;
	int palabra = 0;
	
	Parser_t* parser1=Parser_crear(linea1, numero, offset, palabra);
	printf("\n");
	
	aux=Parser_parsear(parser1);
	print_test("Pruebo que el offset es 0 ",Parser_offset(parser1) == 0);
	print_test("Pruebo que al Parser una ves toma buenas ",strcmp( aux,"buenas") == 0 );
	print_test("Pruebo que el Parseador termino de parsear ",Parser_TerminoDeParsear(parser1));
	free(aux);
	Parser_destruir(parser1);
}

void prueba_LecturaTresStrings() {
	char* linea1 = "Buenas que";
	char* linea2 = "tal como";
	char* linea3 = "estas vos?";
	char* aux;
	int numero = 4;
	int offset = 0;
	int palabra = 0;
	
	Parser_t* parser1=Parser_crear(linea1, numero, offset, palabra);
	printf("\n");
	
	while(!Parser_TerminoDeParsear(parser1)) {
		aux=Parser_parsear(parser1);
		free(aux);
	}
	
	print_test("Pruebo que el final del archivo es 10 ",Parser_posicionEnArchivo(parser1) == 10);
	offset = Parser_posicionEnArchivo(parser1);
	Parser_destruir(parser1);
	
	Parser_t* parser2=Parser_crear(linea2, numero, offset, palabra);
	
	while(!Parser_TerminoDeParsear(parser2)) {
		aux=Parser_parsear(parser2);
		free(aux);
	}
	print_test("Pruebo que el largo de la ultima palabra es 4 ",Parser_LargoUltimaPalabra(parser2)== 4);
	
	offset = Parser_posicionEnArchivo(parser2);
	Parser_destruir(parser2);
	
	Parser_t* parser3=Parser_crear(linea3, numero, offset, palabra);
	
	aux=Parser_parsear(parser3);
	print_test("Pruebo que el offset es 18 ",Parser_offset(parser3) == 18);
	print_test("Pruebo que al Parser una ves toma estas ",strcmp( aux,"estas") == 0 );
	free(aux);
	
	aux=Parser_parsear(parser3);
	print_test("Pruebo que el offset es 24 ",Parser_offset(parser3) == 24);
	print_test("Pruebo que al Parser una ves toma vos ",strcmp( aux,"vos") == 0 );
	print_test("Pruebo que el Parseador termino de parsear ",Parser_TerminoDeParsear(parser3));
	free(aux);
	
	Parser_destruir(parser3);
	
}

void prueba_LecturaTresStringsDistorsionados() {

	char* linea1 = " Buenas% que ";
	char* linea2 = "@tal como!!!";
	char* linea3 = "estas vos?";
	char* aux;
	int numero = 4;
	int offset = 0;
	int palabra = 0;
	
	Parser_t* parser1=Parser_crear(linea1, numero, offset, palabra);
	printf("\n");
	
	while(!Parser_TerminoDeParsear(parser1)) {
		aux=Parser_parsear(parser1);
		palabra = Parser_numeroDePalabra(parser1);
		free(aux);
	}
	
	print_test("Pruebo que el final del archivo es 13 ",Parser_posicionEnArchivo(parser1) == 13);
	offset = Parser_posicionEnArchivo(parser1);
	palabra = Parser_numeroDePalabra(parser1);
	Parser_destruir(parser1);
	
	Parser_t* parser2=Parser_crear(linea2, numero, offset, palabra);
	
	while(!Parser_TerminoDeParsear(parser2)) {
		aux=Parser_parsear(parser2);
		free(aux);
	}
	print_test("Pruebo que el largo de la ultima palabra es 4 ",Parser_LargoUltimaPalabra(parser2)== 4);
	print_test("Pruebo que como es la cuarta palabra ", Parser_numeroDePalabra(parser2) == 4);  
	
	offset = Parser_posicionEnArchivo(parser2);
	palabra = Parser_numeroDePalabra(parser2);
	Parser_destruir(parser2);
	
	Parser_t* parser3=Parser_crear(linea3, numero, offset, palabra);
	
	aux=Parser_parsear(parser3);
	print_test("Pruebo que el offset es 25 ",Parser_offset(parser3) == 25);
	print_test("Pruebo que al Parser una ves toma estas ",strcmp( aux,"estas") == 0 );
	free(aux);
	
	aux=Parser_parsear(parser3);
	print_test("Pruebo que el offset es 31 ",Parser_offset(parser3) == 31);
	print_test("Pruebo que al Parser una ves toma vos ",strcmp( aux,"vos") == 0 );
	print_test("Pruebo que el Parseador termino de parsear ",Parser_TerminoDeParsear(parser3));
	print_test("Pruebo que vos es la palabra 6 ", Parser_numeroDePalabra(parser3) == 6);  
	free(aux);
	
	Parser_destruir(parser3);
}

void prueba_stringNulo() {
	char* stringNULL = NULL;
	int numero = 4;
	int offset = 0;
	int palabra = 0;
	
	Parser_t* parser1=Parser_crear(stringNULL, numero, offset, palabra);
	printf("\n");
	
	print_test("Pruebo que el parser es nulo",parser1 == NULL);
	print_test("Pruebo que el parser no parsea",Parser_parsear(parser1) == NULL);
	print_test("Pruebo que el parser no tiene posicion en el archivo",Parser_posicionEnArchivo(parser1) < 0);
	
	Parser_destruir(parser1);
}

void prueba_stringVacio() {
	char* string = " % ";
	int numero = 4;
	int offset = 0;
	int palabra = 0;
	printf("%zu",strlen(string));
	
	Parser_t* parser1=Parser_crear(string, numero, offset, palabra);
	print_test("\nPruebo que el parser no es nulo",parser1 != NULL);
	//print_test("Pruebo que el parser no parsea",Parser_parsear(parser1) == NULL);
	print_test("Pruebo que el Parseador termino de parsear ",Parser_TerminoDeParsear(parser1));
	
	
	Parser_destruir(parser1);
}

/* ******************************************************************
 *                        PROGRAMA PRINCIPAL
 * *****************************************************************/

/* Programa principal. */
int main(void) {
	printf ("\nCOMIENZO DE PRUEBAS PARSER.\n\n");

    /* Ejecuta todas las pruebas unitarias. */
    prueba_CaracteresAlFinal();
    prueba_CaracteresAlPrincipio();
    prueba_CaracteresEnElMedio();
    prueba_DosStrings();
    prueba_SegundoStringArrancaBasura();
    prueba_StringUnitario();
	prueba_LecturaTresStrings();
	prueba_LecturaTresStringsDistorsionados();
	prueba_stringNulo();
	//prueba_stringVacio();

	printf ("\nFIN DE PRUEBAS PARSER.\n\n");
    return 0;
}




